package ModeloLogicoSistema;

import com.itextpdf.text.DocumentException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import manejoDB.AdministradorDBOrden;

/**
 *
 * @author Veko
 */
public class AdministradorOrden {

    private AdministradorDBOrden consultadorDB;
    private List<Orden> ordenes;
    private List<ServicioContratado> servicios;

    public AdministradorOrden() throws SQLException {
        this.consultadorDB = new AdministradorDBOrden();
        ordenes = new ArrayList<>();
        this.consultadorDB.Conectar();
    }
    
    public List<Orden> cargarTodasLasOrdenes() throws SQLException{
         return this.cargarListaOrdenes(consultadorDB.getAllCodOrdenes());
    }
    
    /**
     *
     * @param los servicios cargados a la orden
     * @return Cliente
     * @see Carga la orden en la base de datos
     */
    
    
    public void persistirOrden(Integer codCliente, String fechaHoraPedido,
            String fechaPactada, String horaPactadaDesde, String horaPactadaHasta,
            Double montoTotal, Double montoAbonado,
            Double montoAdeudado, boolean delivery) throws SQLException {
        /*String estado=EstadoOrden.PENDIENTE.toString();
        this.consultadorDB.setNuevaOrden(codCliente, fechaHoraPedido, fechaPactada,
                horaPactadaDesde,horaPactadaHasta,estado,montoTotal, montoAbonado, 
                montoAdeudado, delivery);*/
        this.consultadorDB.setNuevaOrden(codCliente, fechaHoraPedido, fechaPactada,
                horaPactadaDesde,horaPactadaHasta,EstadoOrden.PENDIENTE.toString(),montoTotal, montoAbonado, 
                montoAdeudado, delivery);
    }
    
    public void persistirServicioDeOrden(Integer codOrden, Servicio servicio, Integer cantidad) throws SQLException{
        this.consultadorDB.setServicioOrden(servicio.getCodServicio(),codOrden,servicio.getPrecio(),cantidad);
    }
    
    

    
    public ServicioContratado cargarServicioContratado(Integer codServ,Integer codOrden){
        ServicioContratado servicio= null;
        try {
            servicio =new ServicioContratado(codServ, codOrden);
            servicio.setNombre(consultadorDB.getNombreServicio(codServ));
            servicio.setPrecio(consultadorDB.getPrecioEnServOrden(codServ, codOrden));
            servicio.setCantidad(consultadorDB.getCantEnServOrden(codServ,codOrden));
            //servicio.setEstado(consultadorDB.getEstadoEnServOrden(codServ,codOrden));
        }
        catch(Exception e){
            
        }
        return servicio;
    }
    
    public List<ServicioContratado> mostrarTodosLosServiciosContratados(Integer codOrden) throws SQLException{
        return cargarListaServiciosContratados(this.consultadorDB.getAllCodServicios(codOrden),codOrden);
    }

    
    
    public List<ServicioContratado> mostrarTodosLosServiciosEspContratados(Integer codOrden) throws SQLException{
        return cargarListaServiciosEspContratados(this.consultadorDB.getAllCodServiciosEsp(codOrden),codOrden);
    }
    
    public List<Orden> mostrarTodasLasOrdenes() throws SQLException{
        return cargarListaOrdenes(this.consultadorDB.getAllCodOrdenes());
    }
    public Double getMontoTotal(List<Servicio> servicios) {
        ListIterator it = servicios.listIterator();
        Double suma = new Double(0);
        while (it.hasNext()) {
            Servicio servicio;
            servicio = (Servicio) it.next();
            suma = +servicio.getPrecio();
        }
        return suma;
    }
/*
    public Double getMontoTotal(Integer codigoOrden) throws SQLException {
        List <Double> precios= this.consultadorDB.getPrecioServicios(codigoOrden);
        ListIterator it = precios.listIterator();
        Double suma = new Double(0);
        while (it.hasNext()) {
            Double precio = (Double) it.next();
            suma = +precio;
        }
        return suma;
    }
*/
    
    /*
    public Double getMontoAdeudado(Double montoTotal, Double montoAbonado) {
        return montoTotal - montoAbonado;
    }*/

    /**
     * Obtiene un nuevo número de orden de una secuencia
     */
    public Integer nuevoCodigoOrden() throws SQLException {
        return this.consultadorDB.getNuevoCodigoOrden();
    }

    public Orden cargarOrden(Integer codigoOrden) {
        Orden orden = null;
        try {
            orden =new Orden(codigoOrden);
            orden.setCodCliente(consultadorDB.getCodCliente(codigoOrden));
            orden.setFechaHoraPedido(consultadorDB.getFechaHoraPedido(codigoOrden));
            orden.setFechaPactada(consultadorDB.getFechaPactada(codigoOrden));
            orden.setFechaHoraEntrega(consultadorDB.getFechaHoraEntrega(codigoOrden));
            orden.setHoraPactadaDesde(consultadorDB.getHoraPactadaDesde(codigoOrden));
            orden.setHoraPactadaHasta(consultadorDB.getHoraPactadaHasta(codigoOrden));/*
            if (consultadorDB.getEstadoOrden(codigoOrden).equalsIgnoreCase(EstadoOrden.PENDIENTE.toString())) {
                orden.setSituacionOrden(EstadoOrden.PENDIENTE);
            }
            if (consultadorDB.getEstadoOrden(codigoOrden).equalsIgnoreCase(EstadoOrden.LISTA.toString())) {
                orden.setSituacionOrden(EstadoOrden.LISTA);
            }
            if (consultadorDB.getEstadoOrden(codigoOrden).equalsIgnoreCase(EstadoOrden.ENTREGADA.toString()) ) {
                orden.setSituacionOrden(EstadoOrden.ENTREGADA);
            }
            
            if (consultadorDB.getEstadoOrden(codigoOrden).equalsIgnoreCase(EstadoOrden.ANULADA.toString()) ) {
                orden.setSituacionOrden(EstadoOrden.ANULADA);
            }*/
            orden.setSituacionOrden(consultadorDB.getEstadoOrden(codigoOrden));
            orden.setTotalMonto(consultadorDB.getMontoTotal(codigoOrden));
            orden.setMontoAbonado(consultadorDB.getMontoAbonado(codigoOrden));
            orden.setMontoAdeudado(consultadorDB.getMontoAdeudado(codigoOrden));
            orden.setDelivery(consultadorDB.getDelivery(codigoOrden));
        } catch (Exception ex) {
        }
        return orden;
    }

    public List<Orden> cargarListaOrdenes(List<Integer> codigosOrdenes) {
        List<Orden> ordenesParaMostrar = new ArrayList<>();
        ListIterator it = codigosOrdenes.listIterator();
        while (it.hasNext()) {
            Orden orden = cargarOrden((Integer) it.next());
            ordenesParaMostrar.add(orden);
        }
        return ordenesParaMostrar;
    }

    /**
     *
     * @see Métodos para buscar datos de ordenes
     */
    public List<Orden> buscarOrdenesPendientes() {
        try {
            return cargarListaOrdenes(consultadorDB.getOrdenesPorEstado(EstadoOrden.PENDIENTE.toString()));
        } catch (SQLException ex) {
            return new ArrayList<Orden>();
        }
    }

    public List<Orden> buscarOrdenesRealizadas() {
        try {
            return cargarListaOrdenes(consultadorDB.getOrdenesPorEstado(EstadoOrden.LISTA.toString()));
        } catch (SQLException ex) {
            return new ArrayList<Orden>();
        }
    }

    public List<Orden> buscarOrdenesRealizadasAEntregarElDia(String fecha) {
        try {
            return cargarListaOrdenes(consultadorDB.getOrdenesRealizadasParaEntregarElDia(2, fecha));
        } catch (SQLException ex) {
            return null;
        }
    }

    public List<Orden> buscarOrdenesPorCliente(Integer codCliente) {
        try {
            return cargarListaOrdenes(consultadorDB.getOrdenesPorCliente(codCliente));
        } catch (SQLException ex) {
            return null;
        }
    }

    /**
     *
     * Anular una orden
     */
    public void anularOrden(Integer codigoOrden) {
        try {
            consultadorDB.ModificarEstado(EstadoOrden.ANULADA.toString(), codigoOrden);
        } catch (SQLException ex) {
        }
    }

    public void imprimirOrden(Integer codOrden) throws IOException, DocumentException {
        Imprimir i = new Imprimir();
        ////tenes que modificar una cosas (nombre fecha tipo de orden)
       // i.crearTicket("lucas", "lavados");
    }

    private List<ServicioContratado> cargarListaServiciosContratados(List<Integer> allCodServicios,Integer codOrden) {
        ListIterator it=allCodServicios.listIterator();
        ArrayList<ServicioContratado> lista=new ArrayList();
        while(it.hasNext()){
            Integer codS=(Integer)it.next();
            ServicioContratado serv=this.cargarServicioContratado(codS, codOrden);
            lista.add(serv);
        }
        return lista;
    }

    public void persistirServEspDeOrden(ServicioEspecialContratado servEsp) throws SQLException {
        this.consultadorDB.setServicioEspecial(servEsp.getCodorden(), servEsp.getNombre(), servEsp.getPrecio(), servEsp.getCantidad(), servEsp.getTipo());
    }

    public int getCantPendientes(String fechaEntrega, String tipoServicio) throws SQLException {
        return this.consultadorDB.getCantPendientesPorEstado(fechaEntrega, EstadoOrden.PENDIENTE.toString(), tipoServicio);
    }

    public void setLugarAlmacenaje(String almacenaje, Integer codOrden) throws SQLException {
        this.consultadorDB.ModificarLugarAlmacenajePedidoListo(almacenaje, codOrden);
    }

    public void modificarEstado(String estado, Integer codOrden) throws SQLException {
        this.consultadorDB.ModificarEstado(estado, codOrden);
    }

    public void setFechaEntrega(String fechaEntrega,Integer idOrden) throws SQLException {
        this.consultadorDB.ModificarFechaEntrega(fechaEntrega, idOrden);
    }

    public void setFechaEntregaPautada(String toString, Integer codOrden) throws SQLException {
        this.consultadorDB.ModificarFechaEntregaPactada(toString, codOrden);
    }

    private List<ServicioContratado> cargarListaServiciosEspContratados(List<Integer> allCodServiciosEsp, Integer codOrden) {
        ListIterator it=allCodServiciosEsp.listIterator();
        ArrayList<ServicioContratado> lista=new ArrayList();
        while(it.hasNext()){
            Integer codS=(Integer)it.next();
            ServicioContratado serv=this.cargarServicioEspContratado(codS, codOrden);
            lista.add(serv);
        }
        return lista;
    
    }

    private ServicioContratado cargarServicioEspContratado(Integer codS, Integer codOrden) {
        ServicioContratado servicio= null;
        try {
            servicio =new ServicioContratado(codS, codOrden);
            servicio.setNombre(consultadorDB.getNombreServicioEsp(codS));
            servicio.setPrecio(consultadorDB.getPrecioEnServOrdenEsp(codS, codOrden));
            servicio.setCantidad(consultadorDB.getCantEnServOrdenEsp(codS,codOrden));
            //servicio.setEstado(consultadorDB.getEstadoEnServOrden(codServ,codOrden));
        }
        catch(Exception e){
            
        }
        return servicio;
    
    }

    
}
